/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"3F741ACF-6486-4AA6-A6C8-9B4AA6B8784C",variableType:4}
 */
var fImpMin = 0;

/**
 * @properties={typeid:24,uuid:"84FA822A-8CF0-4A69-B7FF-1DE2CD3E99B2"}
 */
function resumenCuentaDs(proveedorDesde, proveedorHasta, modo) {
	
	globals.gtotal_saldo = 0
	
	if (proveedorHasta == null)
		proveedorHasta = proveedorDesde
		
	var q_ant = 'SELECT pro.proveedor_id,SUM(importe_signo) as "saldo_ant",pro.razon_social FROM ctacte_pr as "cc" '+
				'join proveedor as "pro" on cc.proveedor_id = pro.proveedor_id '+ 
				'where upper(pro.razon_social) between upper(?) and upper (?) '+
				'and cc.fecha_mov < ? and es_fletero = ? AND cc.userv_id = ?'+
				'group by pro.proveedor_id,pro.razon_social order by pro.proveedor_id'

	globals.gFechaDesde_resumen.setHours(00)
	globals.gFechaDesde_resumen.setMinutes(00)
	globals.gFechaDesde_resumen.setSeconds(00)
	globals.gFechaDesde_resumen.setMilliseconds(000)
	var fecha_desde = globals.gFechaDesde_resumen

	var args 		= new Array(proveedorDesde,proveedorHasta,fecha_desde,globals.gproveedor_o_fletero,globals.gUservID)
	var dataSource  = controller.getDataSource();
	var serverName  = databaseManager.getDataSourceServerName(dataSource)
	var $saldos_ant = databaseManager.getDataSetByQuery(serverName,q_ant,args,-1)
	
	var q_movim = 'SELECT cc.proveedor_id,cc.ctacte_pr_id,pro.razon_social,cc.fecha_mov,cc.cod_mov,cc.comprob_completo,cc.concepto,cc.importe_signo '+
		'FROM ctacte_pr as "cc" join proveedor as "pro" on cc.proveedor_id = pro.proveedor_id '+
		'where upper(pro.razon_social) between upper(?) and upper (?) and cc.fecha_mov BETWEEN ? AND ? and pro.es_fletero = ? AND cc.userv_id = ?'+
		'order by pro.proveedor_id, cc.fecha_mov, cc.ctacte_pr_id'
	var fecha_hasta = globals.gFechaHasta
	fecha_hasta.setHours(23)
	fecha_hasta.setMinutes(59)
	fecha_hasta.setSeconds(59)
	fecha_hasta.setMilliseconds(996)
	
	args 			= new Array(proveedorDesde,proveedorHasta,fecha_desde,fecha_hasta,globals.gproveedor_o_fletero,globals.gUservID)
	var $ds_movim 	= databaseManager.getDataSetByQuery(serverName,q_movim,args,-1)
 
	//Agrego columnas de credito, debito y saldo
	$ds_movim.addColumn('debito')
	$ds_movim.addColumn('credito')
	$ds_movim.addColumn('saldo_aux')
	$ds_movim.addColumn('saldo_final')
	$ds_movim.addColumn('mensaje')
	
	var idxImporte	= $ds_movim.getColumnNames().indexOf("importe_signo",0)+1
	var idxDebito 	= $ds_movim.getColumnNames().indexOf("debito",0)+1
	var idxCredito 	= $ds_movim.getColumnNames().indexOf("credito",0)+1
	var idxSaldo 	= $ds_movim.getColumnNames().indexOf("saldo_aux",0)+1
	var idxFinal 	= $ds_movim.getColumnNames().indexOf("saldo_final",0)+1
	var idxMensaje  = $ds_movim.getColumnNames().indexOf("mensaje",0)+1
	
	var $fecha		= new Date(globals.gFechaDesde_resumen.getFullYear(),globals.gFechaDesde_resumen.getMonth(),globals.gFechaDesde_resumen.getDate()-1)

	//Recorrida calculando el saldo, debito y credito segun corresponda	
	if ($ds_movim.getMaxRowIndex() > 0)
	{
		var $pro_ant 	= $ds_movim.getValue(1,1)
		var $saldo_ant 	= buscarSaldo($saldos_ant,$pro_ant)
		var reg 		= new Array($pro_ant,0,$ds_movim.getValue(1,3),$fecha,null,'Saldo Anterior',null,null,null,null,$saldo_ant,null,null)
		$ds_movim.addRow(1,reg)
		var $cant_m 	= $ds_movim.getMaxRowIndex()
		//Para grabar el saldo final en la primera posicion del proveedor
		var $pp			= 1
		
		for (var i = 2 ; i <= $cant_m ; i++)
		{
			if ($pro_ant != $ds_movim.getValue(i,1))
			{
				//Se muestran todos los proveedores con movimientos
				//Si el saldo del proveedor es menor al minimo, lo borro del dataset
	/*			if (Math.abs($saldo_ant) < fImpMin)
				{
					$ds_movim 	= borrarProveedor($ds_movim,$pro_ant,i-1)
					i 			-= ($cant_m - $ds_movim.getMaxRowIndex())
					$cant_m 	= $ds_movim.getMaxRowIndex()
				}*/
				$ds_movim.setValue($pp,idxFinal,$saldo_ant)
				globals.gtotal_saldo += $saldo_ant
				var $saldoH = saldoHistorico(serverName,$ds_movim.getValue($pp,1),fecha_hasta).toFixed(2) * 1
				var difSaldos = $saldo_ant - $saldoH
				if (Math.abs(difSaldos) > 0.005)
					$ds_movim.setValue($pp,idxMensaje,'Diferencia de Saldos: '+ utils.numberFormat(difSaldos,'###,##0.00') + ' Histórico: ' + utils.numberFormat($saldoH,'###,##0.00'))
				
				$pp 		= i
				//Busco el saldo anterior en el otro dataset
				$pro_ant 	= $ds_movim.getValue(i,1)
				$saldo_ant 	= buscarSaldo($saldos_ant,$pro_ant)
				reg 		= new Array($pro_ant,0,$ds_movim.getValue(i,3),$fecha,null,'Saldo Anterior',null,null,null,null,$saldo_ant,null,null)
				$ds_movim.addRow(i,reg)
				$cant_m++
			}
			if ($ds_movim.getValue(i,idxImporte) != null)
				var $imp = $ds_movim.getValue(i,idxImporte).toFixed(2) * 1
			else
				var $imp = null
			//Calculo saldo, se suma el importe antes de grabar
			$saldo_ant += $imp
			$ds_movim.setValue(i,idxSaldo,$saldo_ant)
			//Si importe_signo < 0 va al credito
			if ($imp < 0)
			{
				$ds_movim.setValue(i,idxCredito,$imp*(-1))
				$ds_movim.setValue(i,idxDebito,null)
			}
			else
			{
				$ds_movim.setValue(i,idxDebito,$imp)
				$ds_movim.setValue(i,idxCredito,null)
			}
		}
		for (var j = $pp ; j < i ; j++)
			$ds_movim.setValue(j,idxFinal,$saldo_ant)
		globals.gtotal_saldo += $saldo_ant
	}
	
	agregarSinMovim($ds_movim, $fecha, $saldos_ant)//, idxFinal)
	crearForm($ds_movim, 'resumen_gral_cuenta_imp_copy', 'cuenta')
	
	/*var $params = {
		userv: uservs_to_uservs.razon_social,
		pTitulo: 'Resumen de Cuenta Desde '+ utils.dateFormat(globals.gFechaDesde,'dd-MM-yyyy') + ' Hasta '+ utils.dateFormat(globals.gFechaHasta,'dd-MM-yyyy'),
		pSaldoTotal: globals.gtotal_saldo
	}
	globals.metodoJasper('impresion','proveedores/resumen_gral.jasper','Resumen_cuenta_pr',$ds_movim,$params)*/

}

/**
 * @param {JSDataSet} $ds_movim
 * @param {Date} $fecha
 * @param {JSDataSet} $saldos
 * 
 * @properties={typeid:24,uuid:"3BCC6B84-3933-4BCF-8F10-F6D4CDB37EE9"}
 */
function agregarSinMovim($ds_movim,$fecha,$saldos)
{
	var $cant = $saldos.getMaxRowIndex()
	for (var i = 1 ; i <= $cant ; i++)
	{
		var $saldo_ant = $saldos.getValue(i,2)
		if (Math.abs($saldo_ant) >= fImpMin)
		{
			var reg	= new Array($saldos.getValue(i,1),0,$saldos.getValue(i,3),$fecha,null,'Saldo Anterior',null,null,null,null,$saldo_ant,$saldo_ant,null)
			$ds_movim.addRow(reg)
			globals.gtotal_saldo += $saldo_ant
		}
	}
}

/**
 * @properties={typeid:24,uuid:"5D12ADF7-D40D-4D8B-83D4-2A54F74BAFAD"}
 */
function buscarSaldo (saldos,proveedor)
{
	var $cant 	= saldos.getMaxRowIndex()
	var i 		= 1
	while (i <= $cant && saldos.getValue(i,1) < proveedor)
		i++
	
	if (i <= $cant && saldos.getValue(i,1) == proveedor)
	{
		/** @type {Number}*/
		var valor = saldos.getValue(i,2)
		//lo elimino para proximas recorridas
		saldos.removeRow(i)
		return valor.toFixed(2) * 1
	}
	return 0
}

/**
 * 
 * No se usa por el momento, se muestran todos los movimientos
 * 
 * @properties={typeid:24,uuid:"353F33E7-56DA-42EA-8C06-42AD118C5A2B"}
 */
function borrarProveedor(movim,proveedor,pos)
{
	while (pos >= 1 && movim.getValue(pos,1) == proveedor)
	{
		movim.removeRow(pos)
		pos--
	}
	return movim
}

/**
 * @properties={typeid:24,uuid:"E3D31CF6-CE9B-4CA5-9067-DD16A05028F9"}
 */
function resumenSaldosDs(proveedorDesde, proveedorHasta, modo)
{
	globals.gtotal_saldo = 0
	if (proveedorHasta == null)
		proveedorHasta = proveedorDesde
		
	var q_movim = 'SELECT cc.proveedor_id,cc.ctacte_pr_id,pro.razon_social,cc.fecha_mov,cc.cod_mov,cc.comprob_completo,cc.concepto,cc.saldo_signo '+
		'FROM ctacte_pr as "cc" join proveedor as "pro" on cc.proveedor_id = pro.proveedor_id '+
		'WHERE upper(pro.razon_social) between upper(?) and upper (?) AND '+
				'cc.fecha_mov <= ? and cc.saldo > 0 and pro.es_fletero = ? AND cc.userv_id = ? '+
		'ORDER BY pro.proveedor_id, cc.fecha_mov, cc.ctacte_pr_id'
	
	var fecha_hasta = globals.gFechaHasta
	fecha_hasta.setHours(23)
	fecha_hasta.setMinutes(59)
	fecha_hasta.setSeconds(59)
	fecha_hasta.setMilliseconds(996)
	var dataSource  = controller.getDataSource();
	var serverName  = databaseManager.getDataSourceServerName(dataSource)
	var args		= [proveedorDesde,proveedorHasta,fecha_hasta,globals.gproveedor_o_fletero,globals.gUservID]
	var $ds_movim 	= databaseManager.getDataSetByQuery(serverName,q_movim,args,-1)

	//Agrego columnas de credito, debito y saldo
	$ds_movim.addColumn('debito')
	$ds_movim.addColumn('credito')
	$ds_movim.addColumn('saldo_aux')
	$ds_movim.addColumn('saldo_final')
	$ds_movim.addColumn('mensaje')
	
	var idxImporte	= $ds_movim.getColumnNames().indexOf("saldo_signo",0)+1
	var idxDebito 	= $ds_movim.getColumnNames().indexOf("debito",0)+1
	var idxCredito 	= $ds_movim.getColumnNames().indexOf("credito",0)+1
	var idxSaldo 	= $ds_movim.getColumnNames().indexOf("saldo_aux",0)+1
	var idxFinal 	= $ds_movim.getColumnNames().indexOf("saldo_final",0)+1
	var idxMensaje  = $ds_movim.getColumnNames().indexOf("mensaje",0)+1
	
	var $pro_ant 	= $ds_movim.getValue(1,1)
	var $cant_m 	= $ds_movim.getMaxRowIndex()
	var $saldo_ant	= 0
	//Para grabar el saldo final en la primera posicion del proveedor
	var $pp			= 1
	
	for (var i = 1 ; i <= $cant_m ; i++)
	{
		if ($pro_ant != $ds_movim.getValue(i,1))
		{
			//Si el saldo del proveedor es menor al minimo, lo borro del dataset
/*			if (Math.abs($saldo_ant) < fImpMin)
			{
				$ds_movim 	= borrarProveedor($ds_movim,$pro_ant,i-1)
				i 			-= ($cant_m - $ds_movim.getMaxRowIndex())
				$cant_m 	= $ds_movim.getMaxRowIndex()
			}*/
			$ds_movim.setValue($pp,idxFinal,$saldo_ant)
			var $saldoH = saldoHistorico(serverName,$ds_movim.getValue($pp,1),fecha_hasta).toFixed(2) * 1
			var difSaldos = $saldo_ant - $saldoH
			if (Math.abs(difSaldos) > 0.005)
					$ds_movim.setValue($pp,idxMensaje,'Diferencia de Saldos: '+ difSaldos/*utils.numberFormat(difSaldos,'###,##0.00')*/ + ' Histórico: ' + utils.numberFormat($saldoH,'###,##0.00'))
			globals.gtotal_saldo += $saldo_ant
			$pp 		= i
			$pro_ant 	= $ds_movim.getValue(i,1)
			$saldo_ant 	= 0
		}
		if ($ds_movim.getValue(i,idxImporte) != null)
			var $imp = $ds_movim.getValue(i,idxImporte).toFixed(2) * 1
		else
			var $imp = null
		//Calculo saldo, se suma el importe antes de grabar
		$saldo_ant += $imp
		$ds_movim.setValue(i,idxSaldo,$saldo_ant)
		//Si importe_signo < 0 va al credito
		if ($imp > 0)
		{
			$ds_movim.setValue(i,idxCredito,$imp)
			$ds_movim.setValue(i,idxDebito,null)
		}
		else
		{
			$ds_movim.setValue(i,idxDebito,$imp*(-1))
			$ds_movim.setValue(i,idxCredito,null)
		}
	}
	$ds_movim.setValue($pp,idxFinal,$saldo_ant)
	globals.gtotal_saldo += $saldo_ant
	
	crearForm($ds_movim, 'resumen_gral_saldos_imp', 'saldos')
	/*var $params = {
		userv: uservs_to_uservs.razon_social,
		pTitulo: 'Resumen de Cuenta Desde '+ utils.dateFormat(globals.gFechaDesde,'dd-MM-yyyy') + ' Hasta '+ utils.dateFormat(globals.gFechaHasta,'dd-MM-yyyy'),
		pSaldoTotal: globals.gtotal_saldo
	}
	globals.metodoJasper('impresion','proveedores/resumen_gral.jasper','Resumen_cuenta_pr',$ds_movim,$params)*/

}

/**
 * @properties={typeid:24,uuid:"B38E7E4A-A095-4742-9612-7ECB0FD0E0E4"}
 */
function crearForm(dataset, nombreForm, tipo)
{
	var nombre = nombreForm + '_' + tipo
	history.removeForm(nombre)
	solutionModel.removeForm(nombre)

	var nombre_form = nombreForm//'resumen_gral_3'
	var frm = solutionModel.cloneForm(nombre,solutionModel.getForm(nombre_form))

							//proveedor_id,    ctacte_pr_id  razon_social,    fecha,             cod_mov,    comprob ,       concepto,	   importe_signo,     debito,       credito,          saldo		saldo_final      mensaje
	var tipos = new Array (JSColumn.INTEGER,JSColumn.INTEGER,JSColumn.TEXT,JSColumn.DATETIME,JSColumn.INTEGER,JSColumn.TEXT,JSColumn.TEXT,JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.NUMBER,JSColumn.TEXT)
	frm.dataSource = dataset.createDataSource(tipo+'_'+nombreForm,tipos)
	
	var sub = frm.getLeadingSubSummaryParts()
	sub[0].groupbyDataProviderIDs = 'razon_social'

	var trail = frm.getTrailingSubSummaryParts()
	trail[0].groupbyDataProviderIDs = 'razon_social'
	
	forms[frm.name].controller.recreateUI()
	forms[frm.name].controller.sort('razon_social asc, proveedor_id asc, fecha_mov asc, ctacte_pr_id asc')
	
	if (application.getApplicationType() == APPLICATION_TYPES.WEB_CLIENT)
		forms[frm.name].controller.showPrintPreview()
	else
	{
		var fecha = new Date()
		fecha = utils.dateFormat(fecha,'dd-MM-yyyy HH-mm-ss')
		var arch = plugins.file.showFileSaveDialog( 'c:/resumenes_pdf/resumen_'+tipo+'_proveedores_'+ utils.dateFormat(new Date(),'dd-MM-yyyy HH-mm-ss')+'.pdf', 'Guardar archivo')
		if (arch)
		{
			forms[frm.name].controller.print(false,false,plugins.pdf_output.getPDFPrinter(arch.getAbsolutePath()))
			application.executeProgram("rundll32.exe", ["url.dll,FileProtocolHandler", arch.getAbsolutePath()])
		}
	}
	return true
}

/**
 * @properties={typeid:24,uuid:"9EB6384E-1E21-4453-9170-7E289EACEE0C"}
 */
function resumenCuenta(event) {
	globals.titulos_resumen()
	resumenCuentaDs(globals.gProveedorDesdeNombre,globals.gProveedorHastaNombre, 'pdf')
}

/**
 * @properties={typeid:24,uuid:"24C205F7-3EF5-4ABA-86D0-8728D95CB0F9"}
 */
function resumenSaldos(event) {
	globals.titulos_resumen()
	resumenSaldosDs(globals.gProveedorDesdeNombre,globals.gProveedorHastaNombre, 'pdf')
}

/**
 * Callback method for when form is shown.
 *
 * @param {Boolean} firstShow form is shown first time after load
 * @param {JSEvent} event the event that triggered the action
 *
 * @properties={typeid:24,uuid:"CB19EAFB-7A3A-4A94-BED0-1E66E35A7201"}
 */
function onShow(firstShow, event) {
	globals.titulos_resumen();
}

/**
 * @properties={typeid:24,uuid:"5CC0E017-6BB5-4A50-B07B-B530D2AE07E2"}
 */
function saldoHistorico(dataSource,proveedor,fHasta)
{
	var query = 'SELECT SUM(importe_signo) as "saldo_ant" FROM ctacte_pr as "cc" '+
				'where cc.proveedor_id = ? and cc.fecha_mov < ? '+
				'group by cc.proveedor_id'
	var args = [proveedor,fHasta]
	var max = 1
	var $ds = databaseManager.getDataSetByQuery(dataSource,query,args,max)
	if ($ds.getMaxRowIndex() > 0)
		return $ds.getValue(1,1)
	return 0
}
